%% 
% El k es el número de neuronas totales. El algoritmo calcula la dimensión
% de la red mediante la función sqrt
% init_mode, es el método de inicialización de la red neuronal.
%           * randinit: inicializa aleatoriamente.
%           * lininit: inicializa mediante componentes principales.
function [bmus, sMap] = wSom(sData, k, init_mode)

    n = round(sqrt(k));

    % cantidad de épocas a entrenar la red neuronal.
    ephocs = 100;

    % Verificar el tipo de entrenamiento de inicialización de la red neuronal.
    if strcmp(init_mode, 'randinit')
        SOMtrmt = som_randinit(sData,'msize',[n n],'rect');
    elseif strcmp(init_mode, 'lininit')
        SOMtrmt = som_lininit(sData,'msize',[n n],'rect');
    else
        error('Modos conocidos de inicializacion: "randinit" y "lininit"')
    end
        
    % entrenar la red neuronal, evitando mostrar la salida "Training 1/xs"
    [T, sMap] = evalc('som_batchtrain(SOMtrmt, sData, ''trainlen'', ephocs)');

    bmus = som_bmus(sMap, sData, 'best');

end 
